package com.powernode.learndrools.config;

import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Drools配置类
 * 用于配置和初始化Drools规则引擎
 */
@Configuration // Spring配置类注解
public class DroolsConfiguration { // Drools配置类定义
    /**
     * 获取Drools的服务实例
     * 静态常量，使用单例模式获取KieServices实例
     */
    private static final KieServices kieServices = KieServices.Factory.get(); // 获取KieServices工厂实例
    /**
     * 规则文件路径
     * 定义Drools规则文件在classpath中的位置
     */
    private static final String RULES_PATH = "rules/user.drl"; // 规则文件路径常量

    /**
     * 创建KieContainer Bean
     * 该方法用于配置和初始化Drools规则引擎容器
     * @return KieContainer 返回配置好的规则引擎容器
     */
    @Bean // Spring Bean注解，声明该方法返回一个Bean对象
    public KieContainer getKieContainer() { // 获取Kie容器的方法
        // 创建Kie文件系统对象，用于管理规则文件
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        // 将规则文件写入文件系统，ResourceFactory用于创建classpath资源
        kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH));
        // 创建KieBuilder对象，用于构建规则引擎
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
        // 执行构建操作，编译所有规则文件
        kieBuilder.buildAll();
        // 获取构建完成的KieModule对象
        KieModule kieModule = kieBuilder.getKieModule();
        // 创建KieContainer容器，使用模块的发布ID
        KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
        // 返回配置好的KieContainer对象
        return kieContainer;
    }
}
